<?php
/**
 * Classe gérant l'affichage d'un planning (avec ou sans accès en écriture)
 *
 * @category librairies
 * @package planning
 *
 * @author Mickaël CASTANHEIRO
 * @version 1.0
 */
class Planning extends shBase {
    /**
     * Constantes
     */
    const MOIS = 'mois';
    const SEMAINE = 'semaine';
    const JOUR = 'jour';

    /**
     * Promotions concernées
     * @access protected
     * @var <array>
     */
    protected $promotions;

    /**
     * Séances générées 
     * @access protected
     * @var <array>
     */
    protected $seances;

    /**
     * Mode de vue parmi Planning::MOIS | Planning::SEMAINE | Planning::JOUR
     * @access protected
     * @var <string>
     */
    protected $mode;

    /**
     * Date depuis laquelle on souhaite voir le planning
     * @access protected
     * @var <date>
     */
    protected $date;

    /**
     * Mode d'affichage (admin ou normal)
     * @access protected
     * @var <boolean>
     */
    protected $admin;

    /**
     * Constructeur de la classe
     */
    public function __construct() {
	$this->promotions = array();
	$this->admin = false;
	$this->seances = array();
    }

    /**
     * Retourne les séances
     * @return <array> séances pour les promotions/date
     */
    public function getSeances() {
	if ( empty($this->seances) ) $this->generateSeances();
	return $this->seances;
    }

    /**
     * Retourne les séances de la promotion demandée (pour la date spécifiée)
     * @return <array> Séances
     */
    public function generateSeances($_jour=null) {
	$this->seances = array();

	// Pour chaque promotion
	foreach ($this->promotions AS $promotion) {
	    $this->seances[$promotion] = array();
	    switch ( $this->mode ) {
		case self::SEMAINE:
		// Pour chaque jour de la semaine
		    for ($i=0; $i<6; $i++) {
			$date_jour = $this->date->jourDeLaSemaine($i);

			$count = shSGBD::count(
				'SELECT count(jours_desactives.id) '.
				'FROM jours_desactives '.
				'INNER JOIN jours_desactives_promotion ON jours_desactives_promotion.id_jours_desactives=jours_desactives.id '.
				'WHERE jours_desactives_promotion.id_promotion=:id_promotion '.
				'AND jours_desactives.date_debut<=:date '.
				'AND jours_desactives.date_fin>=:date ',
				array(':id_promotion'=>$promotion, ':date'=>$date_jour->toSGBD())
			);

			if($count > 0) {
			    $this->seances[$promotion][$date_jour->toURL()] = false;
			}
			else {
			  
			    $seances_p = shSGBD::select(
				    'SELECT DISTINCT seance.id AS id_seance, ue.intitule AS ue, ue.couleur, type_enseignement.intitule AS type_enseignement, enseignant.nom AS nom_enseignant, '.
				    'enseignant.prenom AS prenom_enseignant, seance.heure_debut, seance.heure_fin, salle.intitule AS salle '.
				    'FROM seance '.
				    'INNER JOIN enseignement ON seance.id_enseignement=enseignement.id '.
				    'INNER JOIN ue ON enseignement.id_ue=ue.id '.
				    'INNER JOIN type_enseignement ON enseignement.id_type_enseignement=type_enseignement.id '.
				    'INNER JOIN mutualiser ON seance.id=mutualiser.id_seance '.
				    'LEFT JOIN salle ON seance.id_salle=salle.id '.
				    'LEFT JOIN enseignant ON seance.id_enseignant=enseignant.id '.
				    'WHERE mutualiser.id_promotion=:id_promotion '.
				    'AND seance.jour=:jour ',
				    array(':id_promotion' => $promotion, ':jour' => $date_jour->toSGBD())
			    );

			    // Crée les objets PlanningSeance
			    foreach ( $seances_p AS $seance ) {
				$seance_p = new PlanningSeance;
				if ( $this->admin ) $seance_p->setAdmin(true);
				$seance_p
				    ->setPlanning($this)
				    ->setPromotion($promotion)
				    ->setJour($date_jour->toURL())
				    ->setId($seance->id_seance)
				    ->setIntitule($seance->type_enseignement . ' ' . apostrophe('de', $seance->ue))
				    ->setEnseignant($seance->prenom_enseignant . ' ' . $seance->nom_enseignant)
				    ->setSalle($seance->salle)
				    ->setHeureDebut($seance->heure_debut)
				    ->setHeureFin($seance->heure_fin)
				    ->setCouleur($seance->couleur);

				// Cherche les groupes de la promotion et de la séance
				$groupes_p = shSGBD::select(
				    'SELECT DISTINCT groupe.id, groupe.intitule '.
				    'FROM groupe '.
				    'INNER JOIN participer ON groupe.id=participer.id_groupe '.
				    'WHERE groupe.id_promotion=:id_promotion '.
				    'AND participer.id_seance=:id_seance',
				    array(':id_promotion' => $promotion, ':id_seance' => $seance_p->getId())
				);

				foreach ( $groupes_p AS $groupe ) {
				    $seance_p->addGroupe($groupe->id, $groupe->intitule);
				}

				$this->seances[$promotion][$date_jour->toURL()][] = $seance_p;
			    }
			}
		    }
		    break;

		case self::MOIS:

		    break;

		case self::JOUR:

		    break;
	    }
	}
    }

    /**
     * Retourne l'intervalle d'affichage du planning
     * @return <string> Intervalle
     */
    public function intervalle() {
	if ( $this->mode == Planning::JOUR ) {
	    return $this->date->format('j F Y');
	}
	elseif ( $this->mode == Planning::MOIS ) {
	    return 'du ' . $this->date->jourDuMois(1)->format('j') . ' au ' . $this->date->jourDuMois(31)->format('j F Y');
	}
	elseif ( $this->mode == Planning::SEMAINE ) {
	    $premierJour = $this->date->jourDeLaSemaine(0);
	    $dernierJour = $this->date->jourDeLaSemaine(5);

	    if ( $premierJour->format('Y') != $dernierJour->format('Y') )
		return 'du ' .$premierJour->format('j F Y') . ' au ' .$dernierJour->format('j F Y');
	    else
		return ( $premierJour->format('m') != $dernierJour->format('m') ) ?
			'du ' .$premierJour->format('j F ') . ' au ' .$dernierJour->format('j F Y'):
			'du ' .$premierJour->format('j') . ' au ' .$dernierJour->format('j F Y');

	}
    }

    /**
     * Affiche le planning
     */
    public function display() {
	$template = new shTemplate;
	$template->setPath(DIR_TEMPLATES . '_planning.tpl');
	$template
	    ->addData('promotion', implode('-', $this->getPromotions()))
	    ->addData('date', $this->date)
	    ->addData('mode', $this->mode)
	    ->addData('seances', $this->getSeances())
	    ->addData('intervalle', $this->intervalle());
	$template->display();
    }
}
?>
